<?php
/**
 * Created by PhpStorm.
 * User: Rm
 * Date: 2018/4/2
 * Time: 10:17
 * 不继承TP model
 */
namespace app\common\model;

use com\Mail;
use sms\Qidian;
use think\captcha\Captcha;
use think\facade\Cache;
use think\facade\Session;

class Common
{
    private const CACHE_LAST_SEND = "last_send_time_"; // 短信标记缓存的前缀
    private const SAVE_CAPTCHA    = "captcha_"; // 短信验证码的前缀


    /**
     * 检测验证码
     * @author puzi
     * @date
     * @param string $value 验证码
     * @return bool true 正确 false 错误
     */
    public function checkImgCaptcha(string $value)
    {
        $captcha = new Captcha();

        return $captcha->check($value);
    }

    /**
     * 对手机号掩码
     * @author puzi
     * @date
     * @param string $tel 手机号
     * @return mixed 掩码后的手机号
     */
    public function maskPhone(string $tel)
    {

        $new_tel = substr_replace($tel, '****', 3, 4);

        return $new_tel;
    }

    /**
     * 对银行卡号掩码
     * @author puzi
     * @date
     * @param string $cardNum 银行卡号
     * @return string 掩码后的银行卡号
     */
    public function maskBankCardNo(string $cardNum)
    {
        //截取银行卡号前4位
        $prefix = substr($cardNum, 0, 4);
        //截取银行卡号后4位
        $suffix = substr($cardNum, -4, 4);

        $maskBankCardNo = $prefix." **** **** **** ".$suffix;


        return $maskBankCardNo;
    }

    /**
     * 发送邮件验证码
     * @author 王崇全
     * @date   2018/10/31 17:44
     * @param string $email 邮箱地址
     * @return bool
     * @throws
     */
    public function sendEmailCaptcha(string $email)
    : bool {

        $this->checkTime($email, 10);

        // 验证码
        $smsCaptcha = rand(100000, 999999);

        // 邮件内容
        $content = <<<HTML
<body>
您的验证码为: 
<h2 style="color: red;">{$smsCaptcha}</h2>
请尽快完成接下来的操作!
</body>
HTML;

        //发送邮件
        $status = Mail::send($email, "验证码", $content);

        if ($status != 1) {
            return false;
        }

        $this->saveCaptcha($email, $smsCaptcha, 10);

        return true;
    }

    /**
     * 发送短信验证码
     * @author 王崇全
     * @date   2018/10/31 17:44
     * @param string $tel 电话号码
     * @return bool
     * @throws
     */
    public function sendSmsCaptcha(string $tel)
    : bool {

        // 每分钟只能发送一次
        $this->checkTime($tel, 60);

        // 验证码
        $smsCaptcha = rand(100000, 999999);

        // 短信内容
        $content = '您的验证码是 '.$smsCaptcha;

        //发送短信
        if (!$this->sendSms($tel, $content)) {
            return false;
        }

        $this->saveCaptcha($tel, $smsCaptcha, 60);

        return true;
    }


    /**
     * 发送短信
     * @author 王海东
     * @param string $tel     手机号码
     * @param string $content 短信内容
     * @return bool
     * @throws \Exception
     */
    public function sendSms(string $tel, string $content)
    : bool {
        $q   = new Qidian();
        $ret = $q->sendCodeToPhone($tel, $content);

        return $ret;
    }


    /**
     * 验证验证码是否正确
     * @author 王崇全
     * @date   2018/10/31 17:44
     * @param string $captcha 用户提交的验证码
     * @return bool
     * @throws
     */
    public function checkCaptcha(string $captcha)
    : bool {

        $flag = Session::get(self::SAVE_CAPTCHA) == $captcha;

        // 销毁短信验证码
        Session::delete(self::SAVE_CAPTCHA);

        return $flag;
    }

    /**
     * 检查发送频率
     * @author 王崇全
     * @date   2018/11/1 11:36
     * @param string $to 邮箱地址/手机号
     * @param int    $hz 发送间隔,秒
     * @return void
     * @throws \Exception
     */
    protected function checkTime(string $to, int $hz)
    : void {
        // 每10s只能发送一次
        $lastSendTime = Cache::get(self::CACHE_LAST_SEND.$to);
        if ($lastSendTime) {
            $toWait = time() - $lastSendTime;
            if ($toWait < $hz) {
                throw new \Exception("请于 {$toWait} 秒后再试");
            }
        }
        $lastSendTime = Session::get(self::CACHE_LAST_SEND.$to);
        if ($lastSendTime) {
            $toWait = time() - $lastSendTime;
            if ($toWait < $hz) {
                throw new \Exception("请于 {$toWait} 秒后再试");
            }
        }
    }

    /**
     * 保存验证码-供下次会话检查
     * @author 王崇全
     * @date   2018/11/1 11:38
     * @param string $to
     * @param string $smsCaptcha 验证码
     * @param int    $hz         间隔频率,秒
     * @return void
     */
    protected function saveCaptcha(string $to, string $smsCaptcha, int $hz)
    : void {
        //保存验证码
        Session::set(self::SAVE_CAPTCHA, $smsCaptcha);

        // 保存本次发送时间
        Cache::set(self::CACHE_LAST_SEND.$to, time(), $hz);
        Session::set(self::CACHE_LAST_SEND.$to, time());
    }


}